#pragma once
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <sys/types.h>

// 工具类
class Util{
public:
    static int ReadLine(int sock, std::string& out)
    {
        // 将三种分隔符(\n, \r, \r\n)统一为\n
        char ch = 'X';
        while(ch != '\n')
        {
            ssize_t n = ::recv(sock, &ch, 1, 0);
            if(n > 0)
            {
                // 成功读取一个字符

                if(ch == '\r')
                {
                    // 如果读取到一个\r，探测下一个字符是否为\n
                    ::recv(sock, &ch, 1, MSG_PEEK);
                    if(ch == '\n')
                    {
                        // 行分隔符为 \r\n
                        ::recv(sock, &ch, 1, 0);
                    }
                    else
                    {
                        // 行分隔符为 \r
                        ch = '\n';
                    }
                }
                // 其他字符或\n
                out.push_back(ch);
            }
            else if(n == 0)
            {
                // 对方关闭连接
                LOG(DEBUG, "请求行内容时, 对方关闭连接");
                return 0;
            }
            else
            {
                // 读取失败
                LOG(DEBUG, "请求行内容时, 读取失败");
                return -1;
            }
        }
        // LOG(DEBUG, "请求行内容：%s", out.c_str());
        
        std::cout << out << std::endl;

        return out.size();
    }

    // 根据指定分隔符，将一个字符串分割为两个字符串 
    static bool CutString(std::string&  target, std::string& sub1_out, std::string& sub2_out, std::string sep)
    {
        size_t pos = target.find(sep);
        if(pos == std::string::npos)
            return false;
        else
        {
            sub1_out = target.substr(0, pos);
            sub2_out = target.substr(pos + sep.size());
            return true;
        }
    }
    
};